package com.mp3sdk.fragments; import java.io.IOException; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AutoCompleteTextView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.mp3sdk.activities.MP3SDKUtils; import com.mp3sdk.activities.adapters.SearchListAdapter; import com.mp3sdk.activities.adapters.SearchSuggestAdapter; import com.mp3sdk.common.constants.Constants; import com.mp3sdk.common.utils.ConnectionChecker; import com.mp3sdk.common.utils.MyLog; import com.mp3sdk.common.utils.Utils; import com.mtunemp3sdk.mp3downloader.R; import com.ytsdk.mp3lib.MP3SDK; import com.ytsdk.mp3lib.model.Tracks; public class SearchListFragment extends Fragment { private static final String KEY_CONTENT = "SearchListFragment:Items"; private static final String KEY_FILE_NAME = "SearchListFragment:fileName"; private static final String TAG_SearchListFragment = "SearchListFragment"; private ListView mListView; LinearLayout progressBar; SearchListAdapter mListAdapter; List<Tracks> item = new ArrayList<Tracks>(); private static SearchListFragment thisPointer; private int engineType; private AutoCompleteTextView mEditText; private LinearLayout mSearchButton; private static MP3SDK engine = null; SuggestTask suTask; private List<String> suggestions = new ArrayList<String>(); SearchSuggestAdapter suggetionAdapter = null; private static int numSearches = 0; public static SearchListFragment getInstance(int sdktype) { // if (gridFragent == null) { thisPointer = new SearchListFragment(); // } Bundle args = new Bundle(); args.putInt("engineType", sdktype); thisPointer.setArguments(args); return thisPointer; } @Override public void onCreate(Bundle savedInstanceState) { restoreData(savedInstanceState); Bundle bundle = this.getArguments(); if (bundle != null) { this.engineType = bundle.getInt("engineType"); } super.onCreate(savedInstanceState); engine = MP3SDKUtils.getMP3SDK(getActivity(), this.engineType); Utils.loadFullScreenAd(getActivity()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout_search_video, container, false); progressBar = (LinearLayout) view.findViewById(R.id.loadingPanel); mListView = (ListView) view.findViewById(R.id.listView); mEditText = (AutoCompleteTextView) view.findViewById(R.id.edit_seach); mEditText .setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { performSearch(); return true; } return false; } }); mEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().trim().equals("")) return; if (suTask != null) { suTask.cancel(true); suTask = null; } suTask = new SuggestTask(); suTask.execute(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); suggetionAdapter = new SearchSuggestAdapter(getActivity(), suggestions); mEditText.setAdapter(suggetionAdapter); mSearchButton = (LinearLayout) view .findViewById(R.id.searchButtonLayout); mSearchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { performSearch(); } }); return view; } private void performSearch() { if (++numSearches % Constants.NUM_ADS_PER_SEARCH == 0) { Utils.showFullScreenAd(getActivity()); } String searchText = mEditText.getText().toString(); if (searchText == null || searchText.length() == 0) { return; } closeKeyboard(); if (!isConnectivityPresent()) { return; } Pattern pattern = Pattern.compile("\\s+"); Matcher matcher = pattern.matcher(searchText); String decodedSearchStr = matcher.replaceAll("%20"); new GetVideoListFromYouTube().execute(decodedSearchStr); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); closeKeyboard(); } private void closeKeyboard() { if (SearchListFragment.this == null) { return; } try { InputMethodManager imm = (InputMethodManager) getActivity() .getSystemService(getActivity().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0); } catch (Exception e) { // TODO: handle exception } } public void onListItemClick(AdapterView<?> parent, View v, int position, long id) { Tracks entry = (Tracks) parent.getAdapter().getItem(position); try { engine.previewOrDownloadMP3(getActivity(), entry.getId()); } catch (Exception e) { e.printStackTrace(); } } private void restoreData(Bundle savedInstanceState) { if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) { item = (ArrayList<Tracks>) savedInstanceState.get(KEY_CONTENT); this.engineType = savedInstanceState.getInt(KEY_FILE_NAME); } } private class GetVideoListFromYouTube extends AsyncTask<String, Void, List<Tracks>> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); mListView.setVisibility(View.GONE); } @Override protected List<Tracks> doInBackground(String... params) { List<Tracks> allTracks = null; try { allTracks = engine.searchMP3Tracks(getActivity(), params[0]); return allTracks; } catch (SocketTimeoutException e) { Log.d(TAG_SearchListFragment, e.getMessage()); } catch (IOException e) { Log.d(TAG_SearchListFragment, e.getMessage()); } catch (Exception e) { Log.d(TAG_SearchListFragment, e.getMessage()); } return allTracks; } @Override protected void onPostExecute(List<Tracks> result) { super.onPostExecute(result); // Cancel the Loading Dialog progressBar.setVisibility(View.GONE); addVideoList(result); } } private void addVideoList(List<Tracks> videoList) { if (videoList == null || videoList.size() == 0) { if (!progressBar.isShown()) { } return; } // mErrorTextView.setVisibility(View.GONE); item = videoList; mListAdapter = new SearchListAdapter(getActivity(), R.layout.list_item, item); if (mListView != null) { mListView.setAdapter(mListAdapter); } mListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { onListItemClick(parent, view, position, id); } }); // } // This has to run only at fist time from next the on scroll down will // run if (!item.isEmpty()) { mListView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); } } private boolean isConnectivityPresent() { ConnectivityManager cm = (ConnectivityManager) getActivity() .getSystemService(Context.CONNECTIVITY_SERVICE); ConnectionChecker connectionChecker = new ConnectionChecker( getActivity(), cm, getActivity()); if (MyLog.disableConnectionCheckForDebug) { return true; } if (connectionChecker.isOnline()) { return true; } else { showConnectivityErrorDialog(); return false; } } private void showConnectivityErrorDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setCancelable(true); builder.setIcon(null); builder.setTitle(null); builder.setMessage(getActivity().getString(R.string.enablewifiMsg)); builder.setInverseBackgroundForced(true); builder.setPositiveButton("Settings", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent settingPage = new Intent( android.provider.Settings.ACTION_SETTINGS); getActivity().startActivityForResult(settingPage, 0); dialog.dismiss(); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); } class SuggestTask extends AsyncTask<String, Object, List<String>> { @Override protected List<String> doInBackground(String... params) { return engine.getSearchSuggestion(getActivity(), params[0]); } @Override protected void onPostExecute(List<String> result) { suggestions.clear(); suggestions.addAll(result); suggetionAdapter.notifyDataSetChanged(); } } }